#include "queue.h"
#include<stdio.h>
#include <stdlib.h>

/**
 * 创建一个链队列
 */
queue* create_queue(){
    queue* q = (queue*)malloc(sizeof(queue));
    if(q == NULL)
    {
        printf("内存分配失败\n");
        return NULL;
    }

    q->head = NULL;
    q->tail = NULL;
    return q;
}

/**
 * 入队
 * @param q 队列指针
 * @param val 新添加的元素
 */
void push(queue* q, int val) {
    qnode* new_node = (qnode*)malloc(sizeof(qnode));
    if(new_node == NULL){
        printf("内存分配失败\n");
        return;
    }
    new_node->val = val;
    new_node->next = NULL;

    if(q->tail == NULL)
    {
        q->head = new_node;
        q->tail = new_node;
    }
    else
    {
        q->tail->next = new_node;
        q->tail = new_node;
    }

}

/**
 * 出队
 * @param q 队列指针
 * @return 返回队头元素
 */
int pop(queue* q) {
    if (q->head == NULL) {
        printf("队列为空，无法出队\n");
        return -1;
    }

    //获取头节点
    int val = q->head->val;
    // 更新队头指针
    q->head = q->head->next;

    if (q->head == NULL) {
        q->tail = NULL;
    }

    return val;

}

/**
 * 队列的释放
 */
void release_queue(queue* q) {
    if(q == NULL)
    {
        return;
    }

    qnode* current = q->head;
    while(current != NULL)
    {
        qnode* temp = current;
        current = current->next;
        free(temp);
    }
    free(q);
    
}